<?php

namespace WebmanGrpc\Interceptor;

use Google\Protobuf\Internal\Message;
use Grpc\ServerContext;

/**
 * 日志拦截器
 * 
 * 记录gRPC请求和响应的日志
 */
class LoggingInterceptor implements ServerInterceptorInterface
{
    /**
     * 拦截处理
     * 
     * @param Message $request 请求消息
     * @param ServerContext $context 服务器上下文
     * @param callable $next 下一个处理器
     * @return Message 响应消息
     */
    public function intercept(Message $request, ServerContext $context, callable $next): Message
    {
        // 记录请求开始
        $startTime = microtime(true);
        $method = $context->method();
        
        echo "[gRPC] Request: {$method} at " . date('Y-m-d H:i:s') . "\n";
        
        try {
            // 调用下一个处理器
            $response = $next($request, $context);
            
            // 计算处理时间
            $duration = round((microtime(true) - $startTime) * 1000, 2);
            
            // 记录响应
            echo "[gRPC] Response: {$method} completed in {$duration}ms\n";
            
            return $response;
        } catch (\Throwable $e) {
            // 计算处理时间
            $duration = round((microtime(true) - $startTime) * 1000, 2);
            
            // 记录错误
            echo "[gRPC] Error: {$method} failed in {$duration}ms: " . $e->getMessage() . "\n";
            
            throw $e;
        }
    }
}